package config

import "my_music_server/common/utils"

// 配置加载，这里使用策略模式
//Viper可以处理多种格式的配置，目前已支持从JSON、TOML、YAML、HCL、INI和Java properties文件中读取配置数据。
//Viper还能监视配置文件的变动、重新读取配置文件。在项目中可以用作热加载
// TODO 热加载

// var ServerAllConfig = ServerConfig{}
// var AppicationConfig = &Config{}
var AppicationConfig = NewConfig()

type ServerConfig struct {
	Port              int    `json:"server.port"`      //服务端口
	DatasourceUrl     string `json:"datasource.url"`   //数据库连接
	IsDatasourceDebug bool   `json:"datasource.debug"` //是否开启数据库debug
}

// ymal
type config struct {
	Server     *Server     `yaml:"server" json:"server"`
	DataSource *DataSource `yaml:"datasource" json:"datasource"`
	File       *File       `yaml:"file" json:"file"`
}

// NewConfig 工厂模式，生成默认值
func NewConfig() *config {
	return &config{
		Server: &Server{
			Port: 8080,
		},
		DataSource: &DataSource{
			Url:   "root:root@(127.0.0.1:3306)/mysql?charset=utf8mb4&parseTime=True&loc=Local",
			Debug: false,
		},
		File: &File{
			Path: "",
		},
	}
}

type Server struct {
	Port int `yaml:"port" json:"port" default:"8080"`
}

type DataSource struct {
	Url   string `yaml:"url" json:"url"`
	Debug bool   `yaml:"debug" json:"debug" default:"true"`
}

type File struct {
	Path string `yaml:"path" json:"path" `
}

func InitServerConfig() (err error) {
	//构建加载执行器
	loader := NewLoader()

	//加载yaml
	isYamlFileExists, _ := utils.PathExists("application.yaml")
	isYmlFileExists, _ := utils.PathExists("application.yml")
	if isYamlFileExists || isYmlFileExists {
		//构建yaml加载策略
		err := loader.executeLoad(&YamlLoadStrategy{})
		return err
	}

	//加载properties
	isPropFileExists, _ := utils.PathExists("application.properties")
	if isPropFileExists {
		//构建properties加载策略
		err := loader.executeLoad(&PropertiesStrategy{})
		return err
	}

	isJsonFileExists, _ := utils.PathExists("application.json")
	if isJsonFileExists {
		//构建json加载策略
		err := loader.executeLoad(&JsonLoadStrategy{})
		return err
	}

	return err
}

//InitServerConfig 加载应用配置
//func InitServerConfig() (err error){
//	//加载yaml
//	isYmalFileExists, _ := utils.PathExists("application.yaml")
//	isYmlFileExists, _ := utils.PathExists("application.yml")
//	if isYmalFileExists || isYmlFileExists{
//		//导入配置文件
//		viper.SetConfigType("yaml")
//		viper.SetConfigFile("./application.yml")
//		//读取配置文件
//		err := viper.ReadInConfig()
//		if err != nil {
//			fmt.Println(err.Error())
//		}
//
//		//将配置文件读到结构体中
//		err = viper.Unmarshal(&AppicationConfig)
//		if err != nil {
//			fmt.Println(err.Error())
//		}
//		return err
//	}
//
//	//加载json
//	//isJsonFileExists, _ := utils.PathExists("application.json")
//	//if isJsonFileExists{
//	//	file, err := ioutil.ReadFile("application.json")
//	//	if err != nil {
//	//		return err
//	//	}
//	//	err = json.Unmarshal(file, &ServerAllConfig)
//	//	return err
//	//}
//
//	isJsonFileExists, _ := utils.PathExists("application.json")
//	if isJsonFileExists{
//		//导入配置文件
//		viper.SetConfigType("json")
//		viper.SetConfigFile("./application.json")
//		//读取配置文件
//		err := viper.ReadInConfig()
//		if err != nil {
//			fmt.Println(err.Error())
//		}
//
//		//将配置文件读到结构体中
//		err = viper.Unmarshal(&AppicationConfig)
//		if err != nil {
//			fmt.Println(err.Error())
//		}
//		return err
//	}
//
//	return err
//}
